// composables/useApi.ts
import { useRequestHeaders, useRuntimeConfig, navigateTo, useFetch } from 'nuxt/app'

/**
 * 封装 useFetch，统一处理接口请求
 * @param url 接口路径（如 '/api/posts'）
 * @param options 请求配置（方法、参数、headers 等）
 */
export async function useApi<T>(
  url: string,
  options: Parameters<typeof useFetch>[1] = {}
) {
  // 获取环境配置（从 nuxt.config 中读取）
  // const config = useRuntimeConfig()
  // 基础 API 地址（优先用 options 中的 baseURL，否则用配置的公共地址）
  const baseURL = 'https://www.nicepatches.com/index.php/api';

  // 合并默认配置和用户传入的配置
  const fetchOptions: Parameters<typeof useFetch>[1] = {
    // 默认请求方法
    method: 'GET',
    // 传递客户端 headers（如 cookie，用于服务端渲染时保持登录状态）
    headers: useRequestHeaders(['cookie']),
    // 合并用户传入的配置（用户配置优先级更高）
    ...options,
    // 拼接完整 URL
    baseURL,
    server: true, // 强制服务端
    lazy: false, // 同步执行，确保服务端渲染完成
    // 统一处理响应
    onResponse({ response }) {
      // 可以在这里对响应数据做统一处理（如剥离外层包裹）
      // 示例：如果后端返回格式是 { code: 200, data: ... }，则直接返回 data
      if (response._data?.code === 200) {
        response._data = response._data.data
      }
      // 执行用户传入的 onResponse
      if (typeof options.onResponse === 'function') {
        options.onResponse({ response, request: response.url, options: fetchOptions as any })
      }
    },
    // 统一处理错误
    onResponseError({ response, request }) {
      const status = response?.status
      // 根据状态码处理错误
      switch (status) {
        case 401:
          // 未登录：跳转到登录页（客户端环境才执行导航）
          if (import.meta.client) {
            navigateTo('/login')
          }
          console.error('未授权，请登录')
          break
        case 404:
          console.error(`接口不存在: ${request}`)
          break
        case 500:
          console.error('服务器内部错误')
          break
        default:
          console.error(`请求错误: ${status}`)
      }
      // 执行用户传入的 onResponseError
      if (typeof options.onResponseError === 'function') {
        options.onResponseError({ response, request, options: fetchOptions as any })
      }
    }
  }

  // 调用 useFetch 并返回结果
  const reluset = await useFetch<{
    data: {
      data: T
    }
  }, T>(url, fetchOptions as any);
  console.log('fetchOptions===>', url, options);
  console.log('fetchOptions===>', fetchOptions, options);
  console.log('===>', reluset.data.value);
  return toRef(reluset.data.value?.data?.data);
}